#!/usr/bin/env python
# encoding: utf-8
"""
@author: youfeng
@email: youfeng243@163.com
@license: Apache Licence
@file: sync_app_data.py
@time: 2018/1/20 09:21
"""

import click

from cache.record_cache import RecordCache
from common import util
from common.mongo import MongDb
from config.redis_conf import GS_RECORD_CACHE_CONF
from logger import Logger

# 日志模块
global_log = Logger('sync_app_data.log').get_logger()


class SyncAppData(object):
    PROVINCE_ZH_TO_PY = {
        u'上海': 'shanghai',
        u'云南': 'yunnan',
        u'内蒙古': 'neimenggu',
        u'北京': 'beijing',
        u'吉林': 'jilin',
        u'四川': 'sichuan',
        u'天津': 'tianjin',
        u'宁夏': 'ningxia',
        u'安徽': 'anhui',
        u'山东': 'shandong',
        u'山西': 'shanxicu',
        u'广东': 'guangdong',
        u'广西': 'guangxi',
        u'新疆': 'xinjiang',
        u'江苏': 'jiangsu',
        u'江西': 'jiangxi',
        u'河北': 'hebei',
        u'河南': 'henan',
        u'浙江': 'zhejiang',
        u'海南': 'hainan',
        u'湖北': 'hubei',
        u'湖南': 'hunan',
        u'甘肃': 'gansu',
        u'福建': 'fujian',
        u'西藏': 'xizang',
        u'贵州': 'guizhou',
        u'辽宁': 'liaoning',
        u'重庆': 'chongqing',
        u'陕西': 'shanxi',
        u'青海': 'qinghai',
        u'黑龙江': 'heilongjiang',
        u'上海市': 'shanghai',
        u'云南省': 'yunnan',
        u'北京市': 'beijing',
        u'吉林省': 'jilin',
        u'四川省': 'sichuan',
        u'天津市': 'tianjin',
        u'宁夏省': 'ningxia',
        u'安徽省': 'anhui',
        u'山东省': 'shandong',
        u'山西省': 'shanxicu',
        u'广东省': 'guangdong',
        u'广西省': 'guangxi',
        u'新疆省': 'xinjiang',
        u'江苏省': 'jiangsu',
        u'江西省': 'jiangxi',
        u'河北省': 'hebei',
        u'河南省': 'henan',
        u'浙江省': 'zhejiang',
        u'海南省': 'hainan',
        u'湖北省': 'hubei',
        u'湖南省': 'hunan',
        u'甘肃省': 'gansu',
        u'福建省': 'fujian',
        u'贵州省': 'guizhou',
        u'辽宁省': 'liaoning',
        u'重庆市': 'chongqing',
        u'陕西省': 'shanxi',
    }

    MONGO_CONF = {
        'host': '172.16.215.16',
        'port': 40042,
        'db': 'app_data',
        'username': 'work',
        'password': 'haizhi'
    }

    # 工商结构化表字段 映射 工商网页库字段
    FIELD_DICT = {
        # 主要人员
        'key_person': 'key_person_info',

        # 变更信息
        'changerecords': 'change_info',

        # 分支机构
        'branch': 'branch_info',

        # 出资信息
        'contributor_information': 'contributive_info',

        # 股东信息
        'shareholder_information': 'shareholder_info',

        # 清算信息
        'liquidation_info': 'liquidation_info',

        # 动产抵押信息
        'chattel_mortgage_info': 'chattel_mortgage_info',

        # 列入经营异常名录信息
        'abnormal_operation_info': 'abnormal_operation_info',

        # 股权出质登记信息 股权出资登记
        'equity_pledged_info': 'equity_pledged_info',

        # 知识产权出质登记信息
        'intellectual_property_info': 'intellectual_property_info',

        # 商标注册信息
        'trademark_registration_info': 'trademark_registration_info',

        # 抽查检查结果信息
        'spot_check_result_info': 'spot_check_result_info',

        # 双随机抽查检查结果信息
        'double_spot_check_result_info': 'double_spot_check_result_info',

        # 司法协助信息
        'judicial_assistance_info': 'judicial_assistance_info',

        # 官网提供行政许可信息
        'administrative_licensing_info': 'administrative_licensing_info',

        # 官网提供行政处罚信息
        'administrative_penalty_info': 'administrative_penalty_info',

        # 严重违法失信企业名单（黑名单）信息
        'illegal_promise_enterprise_info': 'illegal_promise_enterprise_info',

        # 股权变更信息
        'change_shareholding_info': 'change_shareholding_info',

        # 公司提供行政许可信息
        'company_administrative_licensing_info': 'company_administrative_licensing_info',

        # 公司提供知识产权出质登记信息
        'company_intellectual_property_info': 'company_intellectual_property_info',

        # 公司提供行政处罚信息
        'company_administrative_penalty_info': 'company_administrative_penalty_info',
    }

    # 全部省份同步
    ALL = 'all'

    def __init__(self, province, log):
        self.source_table = 'enterprise_data_gov_new_2018_01_08'
        self.target_table = 'enterprise_data_gov'
        self.province = province
        self.log = log

        # 数据库
        self.app_data_db = MongDb(self.MONGO_CONF['host'], self.MONGO_CONF['port'], self.MONGO_CONF['db'],
                                  self.MONGO_CONF['username'], self.MONGO_CONF['password'], log=log)

        # redis抓取记录缓存初始化
        self.record_cache_redis = RecordCache(GS_RECORD_CACHE_CONF['host'],
                                              GS_RECORD_CACHE_CONF['port'],
                                              GS_RECORD_CACHE_CONF['password'],
                                              GS_RECORD_CACHE_CONF['db'],
                                              GS_RECORD_CACHE_CONF['max_connections'], log=log)

        self.log.info("初始化完成...")

    def get_success_field(self, item):
        result = {}

        # 判断是否由redis缓存信息
        company = item.get("company")
        zh_province = item.get("province")
        # 通过中文省份名称 获得英文省份信息
        if zh_province not in self.PROVINCE_ZH_TO_PY:
            self.log.error("没有省份信息: company = {} province = {}".format(company, zh_province))
            return None

        province = self.PROVINCE_ZH_TO_PY[zh_province]

        # 获得redis记录信息
        field_dict = self.record_cache_redis.get_gs_crawl_record(province, company)
        if len(field_dict) <= 0:
            # self.log.warn("当前数据没有缓存信息: company = {} province = {}".format(company, zh_province))
            return None

        for key, value in item.iteritems():
            if key == '_id':
                continue

            if key == '_src':
                result[key] = value
                continue

            if key == 'used_name_list':
                result[key] = value
                continue

            # 判断是否是数组或者字典
            if not isinstance(value, list) and not isinstance(value, dict):
                result[key] = value
                continue

            # 判断当前属性是否抓取成功了
            if key not in self.FIELD_DICT:
                continue

            if self.FIELD_DICT[key] not in field_dict:
                continue

            result[key] = value

        return result

    # 开始同步数据
    def start_sync(self):

        self.log.info("开始同步数据...")

        result_list = []
        flag_list = []
        count = 0
        total = 0

        # 如果选的是总局 则同步全部数据 否则按省份同步
        if self.province == 'all':
            select = {'is_new_gsxt': {'$ne': False}}
        else:
            select = {'province': self.province, 'is_new_gsxt': {'$ne': False}}

        for item in self.app_data_db.traverse_batch(self.source_table, select):
            total += 1

            # 获得成功抓取的属性
            result = self.get_success_field(item)
            if result is None:
                continue

            result['is_new_gsxt'] = True
            result['_utime'] = util.get_now_time()

            # _in_time 判断补丁
            if '_in_time' not in result:
                result['_in_time'] = util.get_now_time()
            else:
                if not isinstance(result['_in_time'], basestring):
                    result['_in_time'] = util.get_now_time()

            count += 1
            result_list.append(result)

            _id = item.pop('_id')
            flag_list.append({
                '_id': _id,
                'is_new_gsxt': False,
            })
            if len(result_list) >= 500:
                self.app_data_db.insert_batch_data(self.target_table, result_list, key='_record_id')
                del result_list[:]
                self.app_data_db.insert_batch_data(self.source_table, flag_list)
                del flag_list[:]

            if total % 1000 == 0:
                self.log.info("当前进度:  total = {} count = {}".format(total, count))

        if len(result_list) > 0:
            self.app_data_db.insert_batch_data(self.target_table, result_list, key='_record_id')
            del result_list[:]
            self.app_data_db.insert_batch_data(self.source_table, flag_list)
            del flag_list[:]
        self.log.info("数据同步完成...")


@click.command()
@click.option('--province',
              default='all',
              help='新版工商数据同步到旧工商库')
def main(province):
    SyncAppData(province, global_log).start_sync()


if __name__ == '__main__':
    main()
